home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / SpriteWorld 2.0 ƒ / SpriteWorld Examples / Stars / Stars.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-05  |  8.3 KB  |  320 lines  |  [TEXT/KAHL]

  1. ///--------------------------------------------------------------------------------------
  2. // Stars.c
  3. //
  4. // By Vern Jensen. Created 9/2/96
  5. ///--------------------------------------------------------------------------------------
  6.  
  7.  
  8. #include <SWFPSReport.h>
  9. #include <SWIncludes.h>
  10. #include <SWGameUtils.h>
  11.  
  12. #include "SWApplication.h"
  13. #include "Stars.h"
  14.  
  15.  
  16. #define    kFullScreenWindow            true        // Try me full screen!
  17. #define kWorldRectInset                0            // Make the SpriteWorld smaller?
  18. #define kSyncToVBL                    false        // Sync SpriteWorld to VBL?
  19. #define kMaxFPS                        90            // Set to 0 for unrestricted speed
  20.  
  21. #define kNumStars                    150
  22. #define kMinStarSpeed                1
  23. #define kMaxStarSpeed                3
  24.  
  25. #define kNumSprites                    2
  26. #define    kBaseSpriteMoveDelta        1
  27.  
  28.  
  29. ///--------------------------------------------------------------------------------------
  30. // Globals
  31. ///--------------------------------------------------------------------------------------
  32.  
  33. SpriteWorldPtr    gSpriteWorldP;
  34. WindowPtr        gWindowP;
  35. StarArray        gStarArray[kNumStars];
  36.  
  37. SpritePtr        gSimpleSpriteArray[kNumSprites];
  38. DrawProcPtr        gSpriteDrawProc;
  39.  
  40.  
  41. ///--------------------------------------------------------------------------------------
  42. // Main
  43. ///--------------------------------------------------------------------------------------
  44.  
  45. void    main( void )
  46. {
  47.     Initialize(kNumberOfMoreMastersCalls);
  48.     Randomize();
  49.     
  50.     if ( SWHasSystem7() )
  51.     {
  52.         AllowKeyUpEvents();    // Part of SWGameUtils.c
  53.         SetCursor(*GetCursor(watchCursor));
  54.         
  55.         CreateSpriteWorld();
  56.         CreateSprites();
  57.         
  58.         SetCursor(&qd.arrow);
  59.         HideCursor();
  60.         
  61.         RunAnimation();
  62.         ShutDown();
  63.         
  64.         RestoreEventMask();    // Make sure to call this after calling AllowKeyUpEvents
  65.     }
  66.     else
  67.     {
  68.         CantRunOnThisMachine();
  69.     }
  70. }
  71.  
  72.  
  73. ///--------------------------------------------------------------------------------------
  74. // CreateSpriteWorld
  75. ///--------------------------------------------------------------------------------------
  76.  
  77. void    CreateSpriteWorld( void )
  78. {
  79.     Rect        worldRect, windRect;
  80.     RgnHandle    mBarUpdateRgn;
  81.     OSErr        err;
  82.     
  83.     gWindowP = GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
  84.     
  85.     if (gWindowP != NULL)
  86.     {
  87.         if ( GetDepthFromWindow(gWindowP) != 8 )
  88.         {
  89.             SetCursor(&qd.arrow);
  90.             StopAlert(130, NULL);
  91.             ExitToShell();
  92.         }
  93.         
  94.         
  95.         if (kFullScreenWindow == true)
  96.         {
  97.             SizeWindow(gWindowP, qd.screenBits.bounds.right, 
  98.                     qd.screenBits.bounds.bottom, false);
  99.             MoveWindow(gWindowP, 0, 0, false);
  100.         }
  101.         else
  102.         {
  103.                 // Center window in screen
  104.             windRect = gWindowP->portRect;
  105.             CenterRect(&windRect, &qd.screenBits.bounds);
  106.             MoveWindow(gWindowP, windRect.left, windRect.top, false);
  107.         }
  108.         
  109.         ShowWindow(gWindowP);
  110.         SetPort(gWindowP);
  111.         mBarUpdateRgn = HideMenuBar(gWindowP); // Must be done *after* showing window!
  112.         EraseRgn(mBarUpdateRgn);
  113.         
  114.         ForeColor(blackColor);
  115.         BackColor(whiteColor);
  116.     }
  117.     else
  118.         CantFindResource();
  119.     
  120.     
  121.     err = SWEnterSpriteWorld();
  122.     FatalError(err);
  123.     
  124.     
  125.     worldRect = gWindowP->portRect;
  126.     InsetRect(&worldRect, kWorldRectInset, kWorldRectInset);
  127.     
  128.     
  129.         // Create the sprite world
  130.     err = SWCreateSpriteWorldFromWindow(&gSpriteWorldP, (CWindowPtr)gWindowP, 
  131.             &worldRect, NULL);
  132.     FatalError(err);
  133.     
  134.     
  135.     SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BlitPixie8BitRectDrawProc);
  136.     SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, BlitPixie8BitRectDrawProc);
  137.     
  138.     gSpriteDrawProc = CompiledSprite8BitDrawProc;
  139.  
  140.     
  141.     SWSetSpriteWorldMaxFPS(gSpriteWorldP, kMaxFPS);
  142.     SWSyncSpriteWorldToVBL(gSpriteWorldP, kSyncToVBL);
  143. }
  144.     
  145.  
  146. ///--------------------------------------------------------------------------------------
  147. // CreateSprites
  148. ///--------------------------------------------------------------------------------------
  149.  
  150. void    CreateSprites( void )
  151. {
  152.     SpriteLayerPtr        spriteLayerP;
  153.     SpritePtr            simpleSpriteP;
  154.     short                spriteNum;
  155.     OSErr                err;
  156.     
  157.     
  158.     err = SWCreateSpriteLayer(&spriteLayerP);
  159.     FatalError(err);
  160.  
  161.     err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &simpleSpriteP, NULL, 
  162.             128, 1, kFatMask);
  163.     FatalError(err);
  164.     
  165.     SWCompileSprite(simpleSpriteP);
  166.     gSimpleSpriteArray[0] = simpleSpriteP;
  167.  
  168.     for (spriteNum = 1; spriteNum < kNumSprites; spriteNum++)
  169.     {
  170.         err = SWCloneSprite(simpleSpriteP, &gSimpleSpriteArray[spriteNum], NULL);
  171.         FatalError(err);
  172.     }
  173.     
  174.  
  175.     for (spriteNum = 0; spriteNum < kNumSprites; spriteNum++)
  176.     {
  177.         simpleSpriteP = gSimpleSpriteArray[spriteNum];
  178.         
  179.         SWAddSprite(spriteLayerP, simpleSpriteP);
  180.         SWSetSpriteMoveBounds(simpleSpriteP, &gSpriteWorldP->backRect);
  181.         SWSetSpriteMoveProc(simpleSpriteP, BallSpriteMoveProc);
  182.         SWSetSpriteMoveDelta(simpleSpriteP, kBaseSpriteMoveDelta + spriteNum, 
  183.             kBaseSpriteMoveDelta + spriteNum);
  184.         SWSetSpriteLocation(simpleSpriteP, spriteNum * 60, spriteNum * 60);
  185.         SWSetSpriteDrawProc(simpleSpriteP, gSpriteDrawProc);
  186.     }
  187.  
  188.     SWAddSpriteLayer(gSpriteWorldP, spriteLayerP);
  189.     SWLockSpriteWorld(gSpriteWorldP);
  190.     
  191.     SWSetPortToBackground(gSpriteWorldP);
  192.     PaintRect(&gSpriteWorldP->backRect);
  193. }
  194.  
  195.  
  196. ///--------------------------------------------------------------------------------------
  197. //  RunAnimation
  198. ///--------------------------------------------------------------------------------------
  199.  
  200. void    RunAnimation( void )
  201. {
  202.     unsigned long        frames;
  203.     
  204.     SetUpStars();
  205.     SWUpdateSpriteWorld(gSpriteWorldP, true);
  206.     SWAnimate8BitStarField(gSpriteWorldP, gStarArray, kNumStars, 255);
  207.     
  208.     frames = 0;
  209.     StartTimer();
  210.     
  211.     while (!Button())
  212.     {
  213.         SWProcessSpriteWorld(gSpriteWorldP);
  214.         SWAnimateSpriteWorld(gSpriteWorldP);
  215.         
  216.         if (gSpriteWorldP->frameHasOccured)
  217.         {
  218.             MoveStars();
  219.             SWAnimate8BitStarField(gSpriteWorldP, gStarArray, kNumStars, 255);
  220.             
  221.             frames++;
  222.         }
  223.     }
  224.     
  225.     
  226.     ShowMenuBar(gWindowP);
  227.     ShowResults(frames);
  228. }
  229.  
  230.  
  231. ///--------------------------------------------------------------------------------------
  232. //  ShutDown (clean up and dispose of the SpriteWorld)
  233. ///--------------------------------------------------------------------------------------
  234.  
  235. void    ShutDown( void )
  236. {
  237.     SWDisposeSpriteWorld(gSpriteWorldP);
  238.     SWExitSpriteWorld();
  239.     
  240.     FlushEvents(everyEvent, 0);
  241.     ShowCursor();
  242. }
  243.  
  244.  
  245. ///--------------------------------------------------------------------------------------
  246. //  BallSpriteMoveProc
  247. ///--------------------------------------------------------------------------------------
  248.  
  249. void    BallSpriteMoveProc(SpritePtr ballSpriteP)
  250. {    
  251.     SWOffsetSprite(ballSpriteP, ballSpriteP->horizMoveDelta, ballSpriteP->vertMoveDelta);
  252.     SWBounceSprite(ballSpriteP);
  253. }
  254.  
  255.  
  256. ///--------------------------------------------------------------------------------------
  257. //  SetUpStars
  258. ///--------------------------------------------------------------------------------------
  259.  
  260. void    SetUpStars( void )
  261. {    
  262.     short    curStar;
  263.     Rect    windRect = gSpriteWorldP->windowFrameP->frameRect;
  264.     
  265.     for (curStar = 0; curStar < kNumStars; curStar++)
  266.     {
  267.         gStarArray[curStar].horizLoc = GetRandom(windRect.left, windRect.right-1);
  268.         gStarArray[curStar].vertLoc = GetRandom(windRect.top, windRect.bottom-1);
  269.         gStarArray[curStar].oldHorizLoc = gStarArray[curStar].horizLoc;
  270.         gStarArray[curStar].oldVertLoc = gStarArray[curStar].vertLoc;
  271.         gStarArray[curStar].horizSpeed = GetRandom(kMinStarSpeed, kMaxStarSpeed);
  272.         gStarArray[curStar].color = 0;
  273.         
  274.             // Uncomment this line to make the stars different colors
  275. //        gStarArray[curStar].color = GetRandom(0, 254);
  276.  
  277. /*
  278.             // Uncomment this to make the stars different brightnesses
  279.         gStarArray[curStar].color = GetRandom(244, 254);
  280.         if ( gStarArray[curStar].color == 244 )
  281.             gStarArray[curStar].color = 0;
  282. */
  283.             // Since the star hasn't been drawn yet, it doesn't need to be erased.
  284.         gStarArray[curStar].needsToBeErased = false;
  285.     }
  286. }
  287.  
  288.  
  289. ///--------------------------------------------------------------------------------------
  290. //  MoveStars
  291. ///--------------------------------------------------------------------------------------
  292.  
  293. void    MoveStars( void )
  294. {    
  295.     short    curStar;
  296.     Rect*    windRectP = &gSpriteWorldP->windowFrameP->frameRect;
  297.     
  298.     for (curStar = 0; curStar < kNumStars; curStar++)
  299.     {
  300.             // Save the old position
  301.         gStarArray[curStar].oldHorizLoc = gStarArray[curStar].horizLoc;
  302.         gStarArray[curStar].oldVertLoc = gStarArray[curStar].vertLoc;
  303.         
  304.         gStarArray[curStar].horizLoc += gStarArray[curStar].horizSpeed;
  305.         if (gStarArray[curStar].horizLoc > windRectP->right)
  306.         {
  307.             gStarArray[curStar].vertLoc = GetRandom( windRectP->top, windRectP->bottom-1 );
  308.             gStarArray[curStar].horizLoc -= (windRectP->right - windRectP->left);
  309.         }
  310.  
  311. /*        
  312.             // Change star color (try uncommenting this for a neat effect)
  313.         gStarArray[curStar].color++;
  314.         if (gStarArray[curStar].color >= 255)
  315.             gStarArray[curStar].color -= 255;
  316. */
  317.     }
  318. }
  319.  
  320.